package com.ddd.mill.infrastructure.utils;

import java.util.regex.Pattern;

/**
 * String工具类
 */
public abstract class StringUtils extends org.apache.commons.lang3.StringUtils {
    /**
     * 身份证正则
     **/
    public final static String idNumberRegex = "^[1-9]\\d{5}(18|19|20|(3\\d))\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$";
    /**
     * 手机号正则
     **/
    public final static String mobileRegex = "^(1[3-9]\\d{9}$)";
    /**
     * 密码规则检查，包含字母和数字
     **/
    public final static String passwordRegex = "^(?:(?=.*[0-9].*)(?=.*[A-Za-z].*)(?!.*[\\W].*))[\\W0-9A-Za-z]{8,16}$";

    /**
     * 驼峰转下划线
     *
     * @param str
     * @return
     */
    public static String underscoreName(String str) {
        StringBuilder result = new StringBuilder();
        if (str != null && str.length() > 0) {
            // 循环处理字符
            for (int i = 0; i < str.length(); i++) {
                String s = str.substring(i, i + 1);
                // 在大写字母前添加下划线
                if (s.equals(s.toUpperCase()) && s.matches("[a-zA-Z]+")) {
                    result.append("_");
                }
                // 其他字符直接转成大写
                result.append(s.toUpperCase());
            }
        }
        return result.toString().toLowerCase();
    }

    /**
     * 检查手机号
     *
     * @param mobile
     * @return
     */
    public static boolean checkMobile(String mobile) {
        if (mobile.length() == 11) {
            return checkRegex(mobile, mobileRegex);
        }
        return false;
    }

    /**
     * 检查身份证
     *
     * @param iDNumber
     * @return
     */
    public static boolean checkIDNumber(String iDNumber) {
        return checkRegex(iDNumber, idNumberRegex);
    }

    /**
     * 检查密码规范
     *
     * @param password
     * @return
     */
    public static boolean checkPassword(String password) {
        return checkRegex(password, passwordRegex);
    }

    /**
     * 正则检查
     *
     * @param str
     * @param regex
     * @return
     */
    public static boolean checkRegex(String str, String regex) {
        if (str != null && isNotEmpty(regex) && Pattern.compile(regex).matcher(str).matches()) {
            return true;
        }
        return false;
    }

    /**
     * 字符串格式化(占位符填充, 占位符: {}, 占位符可以自定义)
     *
     * @param template 模板
     * @param args     参数
     * @return 格式化后的字符串
     */
    public static String format(String template, Object... args) {
        StringBuilder result = new StringBuilder(template);
        String rep = "{}";
        for (Object arg : args) {
            int start = result.indexOf(rep);
            int end = start + rep.length();
            result.replace(start, end, String.valueOf(arg));
        }
        return result.toString();
    }
}
